﻿// Inner Fire 游戏引擎库
// CharaAnimation - 角色动画配置
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：框架层(5)
// 用于配置一个角色的动画项目。移动，攻击是使用什么动画等等。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-07

#pragma once

#include "static_string.h"
#include <game/config/config_info.h>
#include <ref_info.h>
#include <xml_reader.h>
#include <EASTL/vector.h>
#include <game/controller/attack_info.h>
#include <klua.h>

namespace ifire::game {
class ConfigManager;
class AnimationClip;
class AnimationBlend;

struct ComboAction {
  int index;
  ikit::rinfo<AttackInfo> attack;

  void Setup();

  ComboAction(const ikit::XmlNode& node, int _index);
};

struct ComboInfo {
  ikit::sstr name;
  eastl::vector<ComboAction> actions;

  void Setup();

  ComboInfo(const ikit::XmlNode& node);
};

class CharaAnimation : public ConfigInfo {

public:
  CharaAnimation(ConfigManager* manager, const ikit::XmlNode& node);
  CharaAnimation(const CharaAnimation& lhs) = delete;
  CharaAnimation& operator=(const CharaAnimation& lhs) = delete;
  ~CharaAnimation();

  void Setup() override;

  // 得到Locomotion
  AnimationBlend* GetLocomotion() { return locomotion.get(); }
  // 按名称得到连招
  ComboInfo* GetCombo(ikit::sstr name);
  // 得到整个项目
  eastl::vector<ComboInfo*>& Combos() { return combo_; }

  // 将项目做为Lua表返回给Lua脚本
  int GetData(lua_State* L);


private:
  // 移动，只需要一种
  ikit::rinfo<AnimationBlend> locomotion;
  // 受击动作，目前只要一种，以后扩展
  ikit::rinfo<AnimationClip> on_damage;
  // 受击动作，目前只要一种，以后扩展
  ikit::rinfo<AnimationClip> on_hit;
  // 连招的配置
  eastl::vector<ComboInfo*> combo_;
};

using CharaAnimationPtr = std::unique_ptr<CharaAnimation>;
using CAnimPtr = std::unique_ptr<CharaAnimation>;
} // namespace ifire::game